from typing import Optional, Callable, Any, Type

from axiom_boot.scraper.interfaces import Extractor


def scraper(
    name: str,
    target_url: Optional[str] = None,
    # schedule: Optional[Callable[..., Any]] = None, # 调度逻辑将在 demo 中实现
    **kwargs: Any
) -> Callable[[Type[Extractor]], Type[Extractor]]:
    """
    一个类装饰器，用于将一个 Extractor 类声明为一个完整的爬虫。

    在核心框架中，此装饰器仅作为元数据标记。
    在 demo 应用中，一个 ApplicationProcessor 将会发现这些被标记的类，
    并根据元数据（如 schedule）将其注册为定时任务。

    Args:
        name: 爬虫的唯一名称，用于日志记录和管理。
        target_url: (可选) 爬虫的默认入口 URL。
        **kwargs: 其他元数据，可供处理器使用。

    Returns:
        返回被装饰的提取器类，并附加爬虫元数据。
    """
    def decorator(cls: Type[Extractor]) -> Type[Extractor]:
        setattr(cls, '_axiom_is_scraper', True)
        setattr(cls, '_axiom_scraper_name', name)
        setattr(cls, '_axiom_scraper_target_url', target_url)
        setattr(cls, '_axiom_scraper_metadata', kwargs)
        return cls
    return decorator 